package com.chilly.vidio.study.leetcode;

import java.util.Arrays;

/**
 * 88. 合并两个有序数组
 * 给你两个有序整数数组 nums1 和 nums2，请你将 nums2 合并到 nums1 中，使 nums1 成为一个有序数组。
 * <p>
 * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n，这样它就有足够的空间保存来自 nums2 的元素。
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
 * 输出：[1,2,2,3,5,6]
 * 示例 2：
 * <p>
 * 输入：nums1 = [1], m = 1, nums2 = [], n = 0
 * 输出：[1]
 *
 * @author Chilly Cui
 * @createDate 2021/2/28
 */
public class No88MergeSortedArray {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] num1 = {1, 2, 3, 0, 0, 0};
        int[] num2 = {2, 5, 6};
        //expect [1, 2, 2, 3, 5, 6]
        solution.merge2(num1, 3, num2, 3);
        System.out.println(Arrays.toString(num1));
        //[1, 2, 2, 3, 5, 6]
    }

    /**
     * 归并排序
     * 方法三 :双指针 /从后往前
     * 时间复杂度 :  O(n + m)
     * 空间复杂度 : O(1)
     */
    static class Solution {
        public void merge2(int[] nums1, int m, int[] nums2, int n) {
            int p1 = m - 1;
            int p2 = n - 1;
            int p = m + n - 1;
            while ((p1 >= 0) && (p2 >= 0)) {
                if (nums1[p1] > nums2[p2]) {
                    nums1[p] = nums1[p1];
                    p1--;
                } else {
                    nums1[p] = nums2[p2];
                    p2--;
                }
                p--;
            }
            // add missing elements from nums2
            System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
        }

        //暴力解法
        public void merge(int[] nums1, int m, int[] nums2, int n) {
            System.arraycopy(nums2, 0, nums1, n, n);
            Arrays.sort(nums1);
        }
    }
}
